package com.pageSplitTag;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
/**
 * 自定义标签  分页技术  自定义标签 先写bean文件  再在webroot目录下的WEB-INF目录下新建一个tlds文件用来存放后缀问.tld的文件
 	在tlds文件下新建.tld 的文件 在.tld文件中配置后 再到web.xml文件中配置  
 * @author meishuangyn
 *
 */
public class PageSplitTag extends TagSupport {

	private static final long serialVersionUID = 1L;

	// 数据集
	@SuppressWarnings("unchecked")
	private List list;
	
	// 数据总量
	private int totalAccount;
	
	// 每页数据量
	private int pageSize;
	
	// 总页数
	private int totalPage;
	
	// 当前页
	private int currentPage = 1;
	
	// 起始下标
	private int startIndex;
	
	// 结束下标
	private int endIndex;

	/**
	 * 设置分页标签数据集
	 */
	@SuppressWarnings("unchecked")
	public void setDate(List list) {
		this.list = list;
	}

	/**
	 * 设置分页标签每页数量
	 */
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	/**
	 * 标签头开始方法
	 */
	public int doStartTag() throws JspException {
		// 通过pageContext对象获取HttpServletRequest对象
		HttpServletRequest request = (HttpServletRequest) pageContext
				.getRequest();

		// 通过数据集获取总行数
		totalAccount = list.size();

		// 设置总页数
		if (0 == totalAccount % pageSize) {// 判断是否能被整除
			totalPage = totalAccount / pageSize;
		} else {
			totalPage = totalAccount / pageSize + 1;
		}

		// 获取当前页参数值
		String page = request.getParameter("currentPage");

		// 验证并为currentPage赋值
		if (null != page && !"".equals(page)) {
			currentPage = Integer.parseInt(page);
		} else {
			currentPage = 1;
		}

		// 判断当前页是否超过最小页数
		if (currentPage <= 0) {
			currentPage = 1;
		}
		
		// 判断当前页是否超过最大页数
		if (currentPage > totalPage) {
			currentPage = totalPage;
		}
		
		// 起始下标
		startIndex = (currentPage - 1) * pageSize;
		
		// 结束下标
		if (currentPage == totalPage) {
			endIndex = totalAccount - 1;
		} else {
			endIndex = currentPage * pageSize - 1;
		}

		// 绑定行数据到dataRow属性中
		request.setAttribute("dataRow", list.get(startIndex));
		
		// 绑定totalPage到totalPage属性中
		request.setAttribute("totalPage", totalPage);
		
		// 绑定currentPage到currentPage属性中
		request.setAttribute("currentPage", currentPage);
		
		return TagSupport.EVAL_BODY_INCLUDE; // 执行标签体内容
	}

	/**
	 * 标签体结束后方法
	 */
	public int doAfterBody() throws JspException {
		startIndex++;	// 开始下标递增
		
		// 判断下标是否越界
		if (startIndex <= endIndex) {
			// 绑定下一行的值到dataRow中
			pageContext.getRequest().setAttribute("dataRow",
					list.get(startIndex));
			return TagSupport.EVAL_BODY_AGAIN;	// 继续循环标签体
		} else {
			return TagSupport.SKIP_BODY;	// 跳过标签体
		}
	}

	/**
	 * 标签结束后方法
	 */
	public int doEndTag() throws JspException {
		return TagSupport.EVAL_PAGE; // 执行标签后的内容
	}
}
